{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "https://mp.weixin.qq.com/s?__biz=MzkyMDMxNDkxOA==&mid=2247484517&idx=1&sn=7b0be9ee3ca50af784cdaf0673fb1041&chksm=c195f12cf6e2783a2e9c58cd8988e206d89b442615b10e60243302352ad872c38e0743a87072&scene=178&cur_album_id=3447886516519747585#rd"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 振动升降指标ASI策略.py\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from datetime import datetime"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_hist_k_data(code,start_date,end_date,frequency='d')->pd.DataFrame:\n",
    "    \"\"\"\n",
    "    获取历史K线数据\n",
    "    :return:\n",
    "    \"\"\"\n",
    "    import baostock as bs\n",
    "    bs.login()\n",
    "    rs = bs.query_history_k_data_plus(code,\"date,code,open,high,low,close,preclose,volume,amount,pctChg\",start_date,end_date,frequency=frequency)\n",
    "    data_list = []\n",
    "    while (rs.error_code == '0') & rs.next():\n",
    "        # 获取一条记录，将记录合并在一起\n",
    "        data_list.append(rs.get_row_data())\n",
    "    result = pd.DataFrame(data_list, columns=rs.fields)\n",
    "    result.open = result.open.astype(float)\n",
    "    result.high = result.high.astype(float)\n",
    "    result.low = result.low.astype(float)\n",
    "    result.close = result.close.astype(float)\n",
    "    result.date= pd.to_datetime(result.date)\n",
    "    result.set_index('date',inplace=True)\n",
    "    bs.logout()\n",
    "    return result"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "login success!\n",
      "logout success!\n"
     ]
    }
   ],
   "source": [
    "# 获取股票数据\n",
    "stock_symbol = 'sz.000001'\n",
    "start_date = '2005-01-01'\n",
    "end_date = '2023-01-01'\n",
    "data = get_hist_k_data(stock_symbol, start_date, end_date)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 计算CDP指标\n",
    "def calculate_cdp(df):\n",
    "    df['AH'] = df['high'].rolling(window=1).max()\n",
    "    df['AL'] = df['low'].rolling(window=1).min()\n",
    "    df['MP'] = (df['high'] + df['low'] + df['close']) / 3\n",
    "    df['R1'] = 2 * df['MP'] - df['AL']\n",
    "    df['S1'] = 2 * df['MP'] - df['AH']\n",
    "    return df\n",
    "data = calculate_cdp(data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 交易策略\n",
    "def trading_strategy(df):\n",
    "    # 假设我们使用R1和S1作为买入和卖出信号\n",
    "    df['Position'] = np.nan\n",
    "    df.loc[df['close'] < df['S1'], 'Position'] = 1  # 买入信号\n",
    "    df.loc[df['close'] > df['R1'], 'Position'] = -1  # 卖出信号\n",
    "    return df\n",
    "\n",
    "data = trading_strategy(data)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 回测策略\n",
    "def backtest_strategy(data):\n",
    "    data['Strategy_Returns'] = data['Position'].shift(1) * data['close'].pct_change()\n",
    "    data['Cumulative_Returns'] = (1 + data['Strategy_Returns']).cumprod()\n",
    "    return data\n",
    "\n",
    "data = backtest_strategy(data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABI0AAAJwCAYAAAAEFJHJAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy80BEi2AAAACXBIWXMAAA9hAAAPYQGoP6dpAABjVElEQVR4nO3de3zO9f/H8ee1sdmwodgcxuaUY075OuVUGGmlr9DRIceQkJQUUULlVDl8EaP4lg46OSXHH5ZyWHJOTcQ2FJsxw/b+/VG7vi7XZtdV17Vrcz3ut9tuN9fn8/58Pq/Prs9F17P35/WxGGOMAAAAAAAAgGv4eLoAAAAAAAAA5D2ERgAAAAAAALBDaAQAAAAAAAA7hEYAAAAAAACwQ2gEAAAAAAAAO4RGAAAAAAAAsENoBAAAAAAAADuERgAAAAAAALBDaAQAAAAAAAA7hEYAAABe5OWXX5bFYnHpPjdu3CiLxaKNGze6dL8AAMCzCI0AAMgFP//8s/r376+KFSuqUKFCCgoKUrNmzTRjxgylpqZax4WHh8tischiscjHx0fFihVT7dq11a9fP23fvj3LfWeOz9ymTJkyateuncNf4L/88ku1bNlSpUqVUmBgoCpWrKiuXbtq9erV1jEnT57Uyy+/rNjY2H/ya8jW0qVLNX36dLfs2x0SExM1YsQIVatWTYGBgSpcuLAaNGigV199VefOnfN0eW4za9YsRUdHe7oMq8ywKvPH19dXpUqV0oMPPqgDBw78rX26+1oHACA/KeDpAgAAuNmtWLFCXbp0kb+/v7p3765atWrp8uXL2rJli5599lnt27dPc+fOtY6vW7eunnnmGUnS+fPndeDAAX300UeaN2+ehg0bpqlTp9odo23bturevbuMMYqLi9OsWbN01113acWKFerQoUO2tb355pt69tln1bJlS40aNUqBgYE6cuSIvvnmG33wwQdq3769pD+/SI8bN07h4eGqW7eua39B+jM02rt3r4YOHeryfbva999/r3vuuUcpKSl67LHH1KBBA0nSjh07NGnSJG3evFlff/21h6t0j1mzZunWW29Vz549bZa3aNFCqamp8vPz80hdQ4YMUcOGDXXlyhXt2bNHc+bM0caNG7V3716FhoY6tS93X+sAAOQnhEYAALhRXFycHnroIVWoUEHr169X6dKlresGDRqkI0eOaMWKFTbblC1bVo899pjNssmTJ+uRRx7RtGnTVKVKFT355JM266tWrWqzzQMPPKDbb79d06dPzzY0unr1ql555RW1bds2y5Dj1KlTTp9vposXLyowMPBvb59XnTt3Tg888IB8fX21e/duVatWzWb9hAkTNG/ePA9V5zk+Pj4qVKiQx47fvHlzPfjgg9bXt912m5588kktXrxYI0eO9Fhd17p06ZL8/Pzk48NEfwBA/sG/WgAAuNHrr7+ulJQUvfvuuzaBUabKlSvr6aefznE/AQEBeu+991SiRAlNmDBBxpgbjq9du7ZuvfVWxcXFZTvmzJkzSk5OVrNmzbJcX6pUKUl/3gLUsGFDSVKvXr2stwJl3qbUqlUr1apVSzt37lSLFi0UGBioF154QZL0+eefq2PHjipTpoz8/f1VqVIlvfLKK0pPT7cep1WrVlqxYoV+/fVX677Dw8Ot69PS0jR27FhVrlxZ/v7+CgsL08iRI5WWlmZTb2pqqoYMGaJbb71VRYsW1X333acTJ07IYrHo5ZdfliRt2LBBFotFy5cvtzvfpUuXymKxKCYmJtvf2X/+8x+dOHFCU6dOtQuMJCkkJEQvvvii9fW1x75WeHi4zWyd6OhoWSwWbdmyRUOGDFHJkiVVrFgx9e/fX5cvX9a5c+fUvXt3FS9eXMWLF9fIkSNtroHsegodPXrU5r3KzsKFC3XXXXepVKlS8vf3V40aNTR79my7mvft26dNmzZZ36dWrVplefzBgwerSJEiunjxot2xHn74YYWGhtpcA6tWrVLz5s1VuHBhFS1aVB07dtS+fftuWPONNG/eXNKft4Ve68SJE3riiScUEhIif39/1axZUwsWLLCuz+lav/59y9SqVSvr7yJzPxaLRR988IFefPFFlS1bVoGBgUpOTlbPnj1VpEgRnThxQp06dVKRIkVUsmRJjRgxwuZ3IkkffPCBGjRooKJFiyooKEi1a9fWjBkz/vbvBQAAZzHTCAAAN/ryyy9VsWJFNW3a9B/vq0iRInrggQf07rvvav/+/apZs2a2Y8+ePauzZ8+qcuXK2Y4pVaqUAgIC9OWXX+qpp55SiRIlshxXvXp1jR8/XmPGjFG/fv2sX8ivPafff/9dHTp00EMPPaTHHntMISEhkv4MQ4oUKaLhw4erSJEiWr9+vcaMGaPk5GS98cYbkqTRo0crKSlJv/32m6ZNm2Y9V0nKyMjQfffdpy1btqhfv36qXr26fvzxR02bNk2HDx/WZ599Zq2hZ8+eWrZsmR5//HE1btxYmzZtUseOHW3OpVWrVgoLC9OSJUv0wAMP2KxbsmSJKlWqpCZNmmT7O/viiy8UEBBgM6vFlZ566imFhoZq3Lhx+vbbbzV37lwVK1ZM27ZtU/ny5fXaa69p5cqVeuONN1SrVi11797dJcedPXu2atasqfvuu08FChTQl19+qYEDByojI0ODBg2SJE2fPl1PPfWUihQpotGjR0uS9X2+Xrdu3TRz5kzrrZmZLl68qC+//FI9e/aUr6+vJOm9995Tjx49FBkZqcmTJ+vixYuaPXu27rzzTu3evdsmQHTU0aNHJUnFixe3LktMTFTjxo1lsVg0ePBglSxZUqtWrVLv3r2VnJysoUOHOnStO+OVV16Rn5+fRowYobS0NOvte+np6YqMjFSjRo305ptv6ptvvtGUKVNUqVIl6yzCtWvX6uGHH9bdd9+tyZMnS5IOHDigrVu3OhQ0AwDgEgYAALhFUlKSkWTuv/9+h7epUKGC6dixY7brp02bZiSZzz//3LpMkundu7c5ffq0OXXqlNm+fbu5++67jSQzZcqUGx5vzJgxRpIpXLiw6dChg5kwYYLZuXOn3bjvv//eSDILFy60W9eyZUsjycyZM8du3cWLF+2W9e/f3wQGBppLly5Zl3Xs2NFUqFDBbux7771nfHx8zP/93//ZLJ8zZ46RZLZu3WqMMWbnzp1Gkhk6dKjNuJ49expJZuzYsdZlo0aNMv7+/ubcuXPWZadOnTIFChSwGZeV4sWLmzp16txwzLWuP3amChUqmB49elhfL1y40EgykZGRJiMjw7q8SZMmxmKxmAEDBliXXb161ZQrV860bNnSumzDhg1GktmwYYPNceLi4uzet7Fjx5rr/xMwq/cpMjLSVKxY0WZZzZo1bY6b3fEzMjJM2bJlTefOnW3GLVu2zEgymzdvNsYYc/78eVOsWDHTt29fm3EJCQkmODjYbnl2x12wYIE5ffq0OXnypFm9erWpXLmysVgs5rvvvrOO7d27tyldurQ5c+aMzT4eeughExwcbP0d3Ohav/59y9SyZcss34+KFSva/W579OhhJJnx48fbLK9Xr55p0KCB9fXTTz9tgoKCzNWrV2/4OwAAwJ24PQ0AADdJTk6WJBUtWtRl+8ycgXP+/Hmb5e+++65KliypUqVKqVGjRtq6dauGDx+eY2PpcePGaenSpapXr57WrFmj0aNHq0GDBqpfv75TT5/y9/dXr1697JYHBARY/3z+/HmdOXNGzZs318WLF3Xw4MEc9/vRRx+pevXqqlatms6cOWP9ueuuuyT9ebuZJOuT3gYOHGiz/VNPPWW3z+7duystLU0ff/yxddmHH36oq1ev2vWSul5ycrJL38/r9e7dWxaLxfq6UaNGMsaod+/e1mW+vr6644479Msvv7jsuNe+T0lJSTpz5oxatmypX375RUlJSU7vz2KxqEuXLlq5cqVSUlKsyz/88EOVLVtWd955p6Q/Z9OcO3dODz/8sM376+vrq0aNGlnf35w88cQTKlmypMqUKaP27dsrKSlJ7733nvVWM2OMPvnkE0VFRckYY3OsyMhIJSUladeuXU6fZ0569Ohh87u91oABA2xeN2/e3OY9LVasmC5cuKC1a9e6vC4AABzF7WkAALhJUFCQJPuA55/I/AJ+fXBx//33a/DgwbJYLCpatKhq1qypwoULO7TPhx9+WA8//LCSk5O1fft2RUdHa+nSpYqKitLevXsdanBctmzZLJ+ctW/fPr344otav369NUTL5EgY8dNPP+nAgQMqWbJkluszm3X/+uuv8vHxUUREhM36rG7Pq1atmho2bKglS5ZYw5glS5aocePGN7ydT/rzPXXl+3m98uXL27wODg6WJIWFhdktP3v2rMuOu3XrVo0dO1YxMTF2fYiSkpKsdTijW7dumj59ur744gs98sgjSklJ0cqVK9W/f39rMPbTTz9JkjUEvF7mZygnY8aMUfPmzZWSkqLly5frgw8+sGk4ffr0aZ07d05z5861eVLhtf5J4/fsXH89ZipUqJDdNV28eHGb93TgwIFatmyZOnTooLJly6pdu3bq2rWr9YmGAADkBkIjAADcJCgoSGXKlNHevXtdts/MfV0fbpQrV05t2rT5R/sOCgpS27Zt1bZtWxUsWFCLFi3S9u3b1bJlyxy3zWo2xblz59SyZUsFBQVp/PjxqlSpkgoVKqRdu3bpueeeU0ZGRo77zcjIUO3atTV16tQs118fpjiqe/fuevrpp/Xbb78pLS1N3377rd55550ct6tWrZpiY2N1+fLlf/R4+esbHmfK7PPjyHJzTSPsa2cnOXKca/3888+6++67Va1aNU2dOlVhYWHy8/PTypUrNW3aNIfep6w0btxY4eHhWrZsmR555BF9+eWXSk1NVbdu3axjMvf93nvvKTQ01G4fBQo49p+qtWvXtl7/nTp10sWLF9W3b1/deeedCgsLsx7nscceU48ePbLcx+23357jcW70e87qPcpullF27/O1SpUqpdjYWK1Zs0arVq3SqlWrtHDhQnXv3l2LFi3KcXsAAFyB0AgAADe69957NXfuXMXExNywwbIjMmdRhIWFqXr16i6qMGt33HGHFi1apPj4eEnZf1m+kY0bN+r333/Xp59+qhYtWliXZ/VEt+z2X6lSJf3www+6++67b1hDhQoVlJGRobi4OFWpUsW6/MiRI1mOf+ihhzR8+HD997//VWpqqgoWLGgTZmQnKipKMTEx+uSTT/Twww/nOL548eI6d+6czbLLly9bf6+uktnw+fpj/frrrzlu++WXXyotLU1ffPGFzUynrG4Nc/Y66Nq1q2bMmKHk5GR9+OGHCg8PV+PGja3rK1WqJOnPgOSfhp7XmjRpkpYvX64JEyZozpw5KlmypIoWLar09PQcj3Ojc8zq/ZT+/D1XrFjxn5Ztx8/PT1FRUYqKilJGRoYGDhyo//znP3rppZdynBUHAIAr0NMIAAA3GjlypAoXLqw+ffooMTHRbv3PP//s0CO0U1NT9fjjj+uPP/7Q6NGj/1aIc72LFy9m+3j5VatWSZJuu+02SbLe6pbVF+bsZM6muHZGzOXLlzVr1iy7sYULF87ydrWuXbvqxIkTmjdvnt261NRUXbhwQZIUGRkpSXb7fvvtt7Os7dZbb1WHDh30/vvva8mSJWrfvr1uvfXWHM9pwIABKl26tJ555hkdPnzYbv2pU6f06quvWl9XqlRJmzdvthkzd+5ch2YAOaNChQry9fW1O1ZWv+vrZfU+JSUlaeHChXZjCxcu7NQ10K1bN6WlpWnRokVavXq1unbtarM+MjJSQUFBeu2113TlyhW77U+fPu3wsa5VqVIlde7cWdHR0UpISJCvr686d+6sTz75JMuZf9ce50bXeqVKlfTtt9/q8uXL1mVfffWVjh8//rfqvJHff//d5rWPj491NlRaWprLjwcAQFaYaQQAgBtVqlRJS5cuVbdu3VS9enV1795dtWrV0uXLl7Vt2zZ99NFH6tmzp802J06c0Pvvvy/pz9lF+/fv10cffaSEhAQ988wz6t+/v0tqu3jxopo2barGjRurffv2CgsL07lz5/TZZ5/p//7v/9SpUyfVq1fPeh7FihXTnDlzVLRoURUuXFiNGjXKtmeL9OdjyosXL64ePXpoyJAhslgseu+992zCiUwNGjTQhx9+qOHDh6thw4YqUqSIoqKi9Pjjj2vZsmUaMGCANmzYoGbNmik9PV0HDx7UsmXLtGbNGt1xxx1q0KCBOnfurOnTp+v3339X48aNtWnTJmuwk1XI1r17dz344IOS/nw0uiOKFy+u5cuX65577lHdunX12GOPqUGDBpKkXbt26b///a/NjLI+ffpowIAB6ty5s9q2basffvhBa9ascSigckZwcLC6dOmit99+WxaLRZUqVdJXX33lUJ+edu3aWWe09O/fXykpKZo3b55KlSplNyOqQYMGmj17tl599VVVrlxZpUqVyrYfkSTVr19flStX1ujRo5WWlmY3mysoKEizZ8/W448/rvr16+uhhx5SyZIldezYMa1YsULNmjVz6LbBrDz77LNatmyZpk+frkmTJmnSpEnasGGDGjVqpL59+6pGjRr6448/tGvXLn3zzTf6448/JN34Wu/Tp48+/vhjtW/fXl27dtXPP/+s999/3zpjypX69OmjP/74Q3fddZfKlSunX3/9VW+//bbq1q3r9pmGAABYefDJbQAAeI3Dhw+bvn37mvDwcOPn52eKFi1qmjVrZt5++22bR89XqFDBSDKSjMViMUFBQaZmzZqmb9++Zvv27VnuW5IZNGiQ0zVduXLFzJs3z3Tq1MlUqFDB+Pv7m8DAQFOvXj3zxhtvmLS0NJvxn3/+ualRo4YpUKCAzSPJW7ZsaWrWrJnlMbZu3WoaN25sAgICTJkyZczIkSPNmjVr7B4Pn5KSYh555BFTrFgxI8lUqFDBuu7y5ctm8uTJpmbNmsbf398UL17cNGjQwIwbN84kJSVZx124cMEMGjTIlChRwhQpUsR06tTJHDp0yEgykyZNsqstLS3NFC9e3AQHB5vU1FSnfncnT540w4YNM1WrVjWFChUygYGBpkGDBmbChAk2NaWnp5vnnnvO3HrrrSYwMNBERkaaI0eO2D26feHChUaS+f77722OM3bsWCPJnD592mZ5jx49TOHChW2WnT592nTu3NkEBgaa4sWLm/79+5u9e/faPT4+c5/X+uKLL8ztt99uChUqZMLDw83kyZPNggULjCQTFxdnHZeQkGA6duxoihYtaiRZHzOf+Yj5a9/TTKNHjzaSTOXKlbP9fW7YsMFERkaa4OBgU6hQIVOpUiXTs2dPs2PHjmy3ufa4H330UZbrW7VqZYKCgsy5c+eMMcYkJiaaQYMGmbCwMFOwYEETGhpq7r77bjN37lyb7bK71o0xZsqUKaZs2bLG39/fNGvWzOzYscO0bNnS+rvIqa6s3jtj7N+Xjz/+2LRr186UKlXK+Pn5mfLly5v+/fub+Pj4G/5OAABwJYsxWfzvPgAAgJtAbGys6tWrp/fff1+PPvqozbqrV6+qTJkyioqK0rvvvuuhCgEAAPIuehoBAICbQmpqqt2y6dOny8fHx6YRd6bPPvtMp0+fVvfu3XOjPAAAgHyHnkYAAOCm8Prrr2vnzp1q3bq1ChQoYH1Meb9+/RQWFmYdt337du3Zs0evvPKK6tWrp5YtW3qwagAAgLyL29MAAMBNYe3atRo3bpz279+vlJQUlS9fXo8//rhGjx6tAgX+9//Jevbsqffff19169ZVdHS0atWq5cGqAQAA8i5CIwAAAAAAANihpxEAAAAAAADsEBoBAAAAAADADo2ws5CRkaGTJ0+qaNGislgsni4HAAAAAADAJYwxOn/+vMqUKSMfnxvPJSI0ysLJkydtnrICAAAAAABwMzl+/LjKlSt3wzGERlkoWrSopD9/gUFBQR6uBgAAAAAAwDWSk5MVFhZmzT5uhNAoC5m3pAUFBREaAQAAAACAm44j7XhohA0AAAAAAAA7hEYAAAAAAACwQ2gEAAAAAAAAO/Q0AgAAAAAgDzPG6OrVq0pPT/d0KcgHfH19VaBAAYd6FuWE0AgAAAAAgDzq8uXLio+P18WLFz1dCvKRwMBAlS5dWn5+fv9oP4RGAAAAAADkQRkZGYqLi5Ovr6/KlCkjPz8/l8wewc3LGKPLly/r9OnTiouLU5UqVeTj8/c7ExEaAQAAAACQB12+fFkZGRkKCwtTYGCgp8tBPhEQEKCCBQvq119/1eXLl1WoUKG/vS8aYQMAAAAAkIf9k5ki8E6uuma48gAAAAAAAGCH0AgAAAAAAAB2CI0AAAAAAABgh9AIAAAAAAC4XEJCgp566ilVrFhR/v7+CgsLU1RUlNatW2cdEx4eLovFIovFooCAAIWHh6tr165av369zb6OHj1qHWexWHTLLbeoXbt22r17d7bHT09P16RJk1StWjUFBASoRIkSatSokebPn28d06pVKw0dOtRl5xweHq7p06e7bH+eRmgEAAAAAABc6ujRo2rQoIHWr1+vN954Qz/++KNWr16t1q1ba9CgQTZjx48fr/j4eB06dEiLFy9WsWLF1KZNG02YMMFuv998843i4+O1Zs0apaSkqEOHDjp37lyWNYwbN07Tpk3TK6+8ov3792vDhg3q169ftuOzY4zR1atXndrmZkFoBAAAAABAPmGM0cXLVz3yY4xxuM6BAwfKYrHou+++U+fOnVW1alXVrFlTw4cP17fffmsztmjRogoNDVX58uXVokULzZ07Vy+99JLGjBmjQ4cO2Yy95ZZbFBoaqjvuuENvvvmmEhMTtX379ixr+OKLLzRw4EB16dJFERERqlOnjnr37q0RI0ZIknr27KlNmzZpxowZ1hlMR48e1caNG2WxWLRq1So1aNBA/v7+2rJli37++Wfdf//9CgkJUZEiRdSwYUN988031uO1atVKv/76q4YNG2bdX6YtW7aoefPmCggIUFhYmIYMGaILFy5Y18fHx6tjx44KCAhQRESEli5dajNr6YknntC9995rc35XrlxRqVKl9O677zr8vjirgNv2DAAAAAAAXCr1SrpqjFnjkWPvHx+pQL+cY4Q//vhDq1ev1oQJE1S4cGG79cWKFctxH08//bReeeUVff755xo5cmSWYwICAiRJly9fznJ9aGio1q9fr4EDB6pkyZJ262fMmKHDhw+rVq1aGj9+vCSpZMmSOnr0qCTp+eef15tvvqmKFSuqePHiOn78uO655x5NmDBB/v7+Wrx4saKionTo0CGVL19en376qerUqaN+/fqpb9++1uP8/PPPat++vV599VUtWLBAp0+f1uDBgzV48GAtXLhQktS9e3edOXNGGzduVMGCBTV8+HCdOnXKuo8+ffqoRYsWio+PV+nSpSVJX331lS5evKhu3brl+Pv8u5hpBAAAAAAAXObIkSMyxqhatWp/ex8lSpRQqVKlrAHO9c6dO6dXXnlFRYoU0b/+9a8sx0ydOlWnT59WaGiobr/9dg0YMECrVq2yrg8ODpafn58CAwMVGhqq0NBQ+fr6WtePHz9ebdu2VaVKlVSiRAnVqVNH/fv3V61atVSlShW98sorqlSpkr744gtrzb6+vtaZU6GhoZKkiRMn6tFHH9XQoUNVpUoVNW3aVG+99ZYWL16sS5cu6eDBg/rmm280b948NWrUSPXr19f8+fOVmppqraVp06a67bbb9N5771mXLVy4UF26dFGRIkX+9u85J8w0AgAAAAAgnwgo6Kv94yM9dmxHOHMbW077ufYWL+nP8MTHx0cXLlxQxYoV9eGHHyokJCTL7WvUqKG9e/dq586d2rp1qzZv3qyoqCj17NnTphl2du644w6b1ykpKXr55Ze1YsUKxcfH6+rVq0pNTdWxY8duuJ8ffvhBe/bs0ZIlS2zOLSMjQ3FxcTp8+LAKFCig+vXrW9dXrlxZxYsXt9lPnz59NHfuXI0cOVKJiYlatWqVXcNwVyM0AgAAAAAgn7BYLA7dIuZJVapUkcVi0cGDB//2Pn7//XedPn1aERERNss//PBD1ahRQ7fccotDt7n5+PioYcOGatiwoYYOHar3339fjz/+uEaPHm237+tdf2vdiBEjtHbtWr355puqXLmyAgIC9OCDD2Z7e1ymlJQU9e/fX0OGDLFbV758eR0+fDjH85D+vIXt+eefV0xMjLZt26aIiAg1b97coW3/rrx9pQEAAAAAgHylRIkSioyM1MyZMzVkyBC78OXcuXM5Bj4zZsyQj4+POnXqZLM8LCxMlSpV+tu11ahRQ5KsTaj9/PyUnp7u0LZbt25Vz5499cADD0j6Mwy6/va5rPZXv3597d+/X5UrV85yv7fddpuuXr2q3bt3q0GDBpL+vMXv7NmzNuNuueUWderUSQsXLlRMTIx69erlUN3/BD2NAAAAAACAS82cOVPp6en617/+pU8++UQ//fSTDhw4oLfeektNmjSxGXv+/HklJCTo+PHj2rx5s/r166dXX31VEyZMyDZoccSDDz6oadOmafv27fr111+1ceNGDRo0SFWrVrX2WwoPD9f27dt19OhRnTlzRhkZGdnur0qVKvr0008VGxurH374QY888ojd+PDwcG3evFknTpzQmTNnJEnPPfectm3bpsGDBys2NlY//fSTPv/8cw0ePFiSVK1aNbVp00b9+vXTd999p927d6tfv34KCAiwuz2vT58+WrRokQ4cOKAePXr87d+NozwaGmXeT1imTBlZLBZ99tlnNxwfHx+vRx55RFWrVpWPj4+GDh2a5biP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",
      "text/plain": [
       "<Figure size 1400x700 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 绘制策略的累计收益\n",
    "plt.figure(figsize=(14, 7))\n",
    "plt.plot(data['Cumulative_Returns'], label='CDP Strategy')\n",
    "plt.title('CDP Strategy Cumulative Returns')\n",
    "plt.xlabel('Date')\n",
    "plt.ylabel('Cumulative Returns')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "tf",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
